/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Com.Entity;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Ardha
 */
public class TransaksiGedung {

    private String nama_penyewa;
    private String idPenyewa;
    private String jenisId;
    private String no_telp;
    private String jenisGedung;
    private String no_sewa;
    private String tanggalLahir;
    private String jamSewa;
    private String jamKeluar;
    private String id_karyawan;
    private long totalHarga;
    private String tanggalSewa;
    private long totalSewaBulanan;
    private Connection koneksi = null;
    static String kodeAwal = "MIAAG";
    private static int ballRoom = 600000;
    private static int meetingRoom = 400000;
    private static TransaksiGedung transaksiGedung;

    public TransaksiGedung() {
    }

    public static TransaksiGedung getKoneksiKontrol() throws SQLException, FileNotFoundException, IOException {
        if (transaksiGedung == null) {
            transaksiGedung = new TransaksiGedung(Com.Entity.Koneksi.getDBConnection());
        }
        return transaksiGedung;
    }

    /**
     * @return the nama_penyewa
     */
    public String getNama_penyewa() {
        return nama_penyewa;
    }

    /**
     * @param nama_penyewa the nama_penyewa to set
     */
    public void setNama_penyewa(String nama_penyewa) throws Exception {
        if (nama_penyewa == null || nama_penyewa.matches("")) {
            throw new Exception("Nama belum diisi atau masih kosong");
        } else if (nama_penyewa.matches("[a-zA-Z ]*")) {
            this.nama_penyewa = nama_penyewa;
        } else {
            throw new Exception("Masukan Nama salah, tidak boleh menginputkan angka");
        }

    }

    /**
     * @return the no_telp
     */
    public String getNo_telp() {
        return no_telp;
    }

    /**
     * @param no_telp the no_telp to set
     */
    public void setNo_telp(String no_telp) throws Exception {
        if (no_telp == null || no_telp.matches("")) {
            throw new Exception("nomor telp belum diisi atau masih kosong");
        } else if (no_telp.startsWith("+") && no_telp.length() <= 15) {
            if (!no_telp.substring(1).matches("[0-9]*")) {
                throw new Exception("nomor telp hanya berisi angka dan dapat diawali tanda +");
            } else {
                this.no_telp = no_telp;
            }
        } else if (no_telp.matches("[0-9]*") && no_telp.length() <= 15) {
            this.no_telp = no_telp;
        } else if (no_telp.length() > 15) {
            throw new Exception("nomor telp lebih dari 15 digit");
        } else {
            throw new Exception("nomor telp hanya berisi angka dan dapat diawali tanda +");
        }
    }

    /**
     * @return the jenisGedung
     */
    public String getJenisGedung() {
        return jenisGedung;
    }

    /**
     * @param jenisGedung the jenisGedung to set
     */
    public void setJenisGedung(String jenis_gedung) throws Exception {
        if (jenis_gedung == null) {
            throw new Exception("Jenis gedung belum diisi");
        } else if (jenis_gedung.replace(" ", "").matches("BALLROOM")
                || jenis_gedung.replace(" ", "").matches("MEETINGROOM")) {
            this.jenisGedung = jenis_gedung;
        } else {
            throw new Exception("Pilihan Salah, harap pilih Jenis Gedung dengan benar");
        }
    }

    public TransaksiGedung(Connection konek) {
        this.koneksi = konek;
    }

    /**
     * @return the no_sewa
     */
    public String getNo_sewa() {
        return no_sewa;
    }

    /**
     * @param no_sewa the no_sewa to set
     */
    public void setNo_sewa(String no_sewa) {
        this.no_sewa = no_sewa;
    }

    /**
     * @return the tanggalLahir
     */
    public String getTanggalLahir() {
        return tanggalLahir;
    }

    /**
     * @param tanggalLahir the tanggalLahir to set
     */
    public void setTanggalLahir(String tanggalLahir) throws Exception {
        if (tanggalLahir == null || tanggalLahir.matches("")) {
            throw new Exception("Tanggal lahir masih kosong atau belum diisi");
        } else if (tanggalLahir.length() > 10) {
            throw new Exception("Tanggal lahir terlalu panjang");
        } else if (!tanggalLahir.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
            throw new Exception("Format lahir salah, format tanggal = dd-MM-yyyy");
        } else if (tanggalLahir.substring(0, 2).matches("[0][0]")) {
            throw new Exception("Hari tidak mungkin 00");
        } else if (tanggalLahir.substring(3, 5).matches("[0][0]")) {
            throw new Exception("Bulan tidak mungkin 00");
        } else {
            this.tanggalLahir = tanggalLahir;
        }
    }

    /**
     * @return the jamSewa
     */
    public String getJamSewa() {
        return jamSewa;
    }

    /**
     * @param jamSewa the jamSewa to set
     */
    public void setJamSewa(String jamSewa) throws Exception {
        if (jamSewa == null || jamSewa.matches("")) {
            throw new Exception("jam sewa belum diisi atau masih kosong");
        } else if (jamSewa.matches("[0-1][0-9][:][0-5][0-9]")) {
            this.jamSewa = jamSewa;
        } else if (jamSewa.matches("[2][0-3][:][0-5][0-9]")) {
            this.jamSewa = jamSewa;
        } else if (jamSewa.matches("[2][4][:][0][0]")) {
            this.jamSewa = jamSewa;
        } else {
            throw new Exception("format penulisan salah, format jam hh:mm");
        }
    }

    /**
     * @return the jamKeluar
     */
    public String getJamKeluar() {
        return jamKeluar;
    }

    /**
     * @param jamKeluar the jamKeluar to set
     */
    public void setJamKeluar(String jamKeluar) throws Exception {
        if (jamKeluar == null || jamKeluar.matches("")) {
            throw new Exception("jam keluar belum diisi atau masih kosong");
        } else if (jamKeluar.matches("[0-1][0-9][:][0-5][0-9]")) {
            this.jamKeluar = jamKeluar;
        } else if (jamKeluar.matches("[2][0-3][:][0-5][0-9]")) {
            this.jamKeluar = jamKeluar;
        } else if (jamKeluar.matches("[2][4][:][0][0]")) {
            this.jamKeluar = jamKeluar;
        } else {
            throw new Exception("format penulisan salah, format jam hh:mm");
        }
    }

    /**
     * @return the totalSewaBulanan
     */
    public long getTotalSewaBulanan() {
        return totalSewaBulanan;
    }

    /**
     * @param jamKeluar the jamKeluar to set
     */
    public void setTotalSewaBulanan(long totalSewaBulanan) {
        this.totalSewaBulanan = totalSewaBulanan;
    }

    //simpan transaksi gedung
    public void simpanTransaksiGedung(TransaksiGedung gedung) throws SQLException {
        PreparedStatement prepare = null;
        String sql1 = "update transaksigedung set idkaryawan=(?),namapenyewa=(?)"
                + ", idpenyewa=(?),tanggallahir=(?),noHP=(?),jenisid=(?), "
                + "tanggalbooking=to_char(sysdate,'dd-MM-yyyy'),tanggalsewa=(?),"
                + "jamsewa=(?),jamkeluar=(?),totaltagihan=(?), jenisgedung=(?) "
                + "where notransaksigedung='" + gedung.getNo_sewa() + "'";
        prepare = koneksi.prepareStatement(sql1);
        prepare.setObject(1, gedung.getId_karyawan());
        prepare.setObject(2, gedung.getNama_penyewa());
        prepare.setObject(3, gedung.getIdPenyewa());
        prepare.setObject(4, gedung.getTanggalLahir());
        prepare.setObject(5, gedung.getNo_telp());
        prepare.setObject(6, gedung.getJenisId());
        prepare.setObject(7, gedung.getTanggalSewa());
        prepare.setObject(8, gedung.getJamSewa());
        prepare.setObject(9, gedung.getJamKeluar());
        prepare.setObject(10, gedung.getTotalHarga());
        prepare.setObject(11, gedung.getJenisGedung());

        prepare.executeUpdate();
        koneksi.commit();
    }

    public String callNoTransaksi() throws SQLException {
        CallableStatement clstate = null;
        String sql = "{CALL notransgedung(?,?)}";
        clstate = koneksi.prepareCall(sql);
        clstate.setString(1, kodeAwal);
        clstate.registerOutParameter(2, java.sql.Types.VARCHAR);
        clstate.execute();
        String nomor = clstate.getString(2);
        clstate.close();
        return nomor;

    }

    public List<TransaksiGedung> getJadwal() throws SQLException, Exception {
        PreparedStatement statement = null;
        ResultSet result = null;
        koneksi.setAutoCommit(false);
        String sql = "select to_char(tanggalsewa,'dd-MM-yyyy'), namapenyewa, jamsewa, jamkeluar,jenisgedung"
                + " from transaksigedung where tanggalsewa is not null and tanggalsewa >=sysdate order by tanggalsewa";
        statement = koneksi.prepareStatement(sql);
        result = statement.executeQuery();
        List<TransaksiGedung> gedung = new ArrayList<TransaksiGedung>();

        while (result.next()) {
            TransaksiGedung jadwal = new TransaksiGedung();
            String tanggal = result.getString(1);
            String nama = result.getString(2);
            String jamsewa = result.getString(3);
            String jamkeluar = result.getString(4);
            String jenisgedung = result.getString(5);
            jadwal.setTanggalSewa(tanggal);
            jadwal.setNama_penyewa(nama);
            jadwal.setJamSewa(jamsewa);
            jadwal.setJamKeluar(jamkeluar);
            jadwal.setJenisGedung(jenisgedung);
            gedung.add(jadwal);

        }
        koneksi.commit();
        return gedung;
    }

    public List<TransaksiGedung> getDailyReportGedung(Date tanggal) throws SQLException {
        List<TransaksiGedung> gedung = new ArrayList<TransaksiGedung>();
        try {
            Connection conn = Koneksi.getDBConnection();
            PreparedStatement prepare = null;
            ResultSet result = null;
            koneksi.setAutoCommit(false);
            String sql = "select notransaksigedung,to_char(tanggalsewa,'dd-MM-yyyy'),jenisgedung,"
                    + "jamsewa, jamkeluar, totaltagihan from transaksigedung "
                    + "where to_char(tanggalsewa,'dd-MM-yyyy')=(?)";
            prepare = koneksi.prepareStatement(sql);
            String hari = null;
            if (tanggal.getDate() < 10) {
                hari = "0" + tanggal.getDate();
            } else {
                hari = String.valueOf(tanggal.getDate());
            }
            String bulan = null;
            if ((tanggal.getMonth() + 1) < 10) {
                bulan = "0" + (tanggal.getMonth() + 1);
            } else {
                bulan = String.valueOf((tanggal.getMonth() + 1));
            }
            String date = hari + "-" + bulan + "-" + ((Integer) tanggal.getYear() + 1900);
            prepare.setString(1, date);
            result = prepare.executeQuery();
            while (result.next()) {
                TransaksiGedung trans = new TransaksiGedung();
                trans.setNo_sewa(result.getString(1));
                try {
                    trans.setTanggalSewaLaporan(result.getString(2));
                    trans.setJenisGedung(result.getString(3));
                    trans.setJamSewa(result.getString(4));
                    trans.setJamKeluar(result.getString(5));
                } catch (Exception ex) {
                    return gedung;
                }
                trans.setTotalHarga(result.getLong(6));
                gedung.add(trans);
            }
            return gedung;
        } catch (FileNotFoundException ex) {
            return gedung;
        } catch (IOException ex) {
            return gedung;
        }
    }

    /**
     * @return the id_karyawan
     */
    public String getId_karyawan() {
        return id_karyawan;
    }

    /**
     * @param id_karyawan the id_karyawan to set
     */
    public void setId_karyawan(String id_karyawan) {
        this.id_karyawan = id_karyawan;
    }

    /**
     * @return the totalHarga
     */
    public long getTotalHarga() {
        return totalHarga;
    }

    /**
     * @param totalHarga the totalHarga to set
     */
    public void setTotalHarga(long totalHarga) {
        try {
            this.totalHarga = totalHarga;
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "Harga tidak boleh huruf, ulangi kembali");
        }
    }

    /**
     * @return the tanggalSewa
     */
    public String getTanggalSewa() {
        return tanggalSewa;
    }

    /**
     * @param tanggalSewa the tanggalSewa to set
     */
    public void setTanggalSewa(String tanggalSewa) throws Exception {
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = (Date) formatter.parse(tanggalSewa);
        if (tanggalSewa == null) {
            this.tanggalSewa = tanggalSewa;
        } else {
            if (tanggalSewa.length() > 10) {
                throw new Exception("Tanggal sewa terlalu panjang");
            } else if (!tanggalSewa.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
                throw new Exception("Format tanggal salah, format tanggal = dd-MM-yyyy");
            } else if (tanggalSewa.substring(0, 2).matches("[0][0]")) {
                throw new Exception("Hari tidak mungkin 00");
            } else if (tanggalSewa.substring(3, 5).matches("[0][0]")) {
                throw new Exception("Bulan tidak mungkin 00");
            } else if (date.before(new GregorianCalendar().getTime())) {
                throw new Exception("Silahkan pilih tanggal minimal 1 hari setelah hari ini");
            } else {
                this.tanggalSewa = tanggalSewa;
            }
        }
    }
    
    public void setTanggalSewaLaporan(String tanggalSewa) throws Exception {
        if (tanggalSewa == null) {
            this.tanggalSewa = tanggalSewa;
        } else {
            if (tanggalSewa.length() > 10) {
                throw new Exception("Tanggal sewa terlalu panjang");
            } else if (!tanggalSewa.matches("[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]")) {
                throw new Exception("Format tanggal salah, format tanggal = dd-MM-yyyy");
            } else if (tanggalSewa.substring(0, 2).matches("[0][0]")) {
                throw new Exception("Hari tidak mungkin 00");
            } else if (tanggalSewa.substring(3, 5).matches("[0][0]")) {
                throw new Exception("Bulan tidak mungkin 00");
            } else {
                this.tanggalSewa = tanggalSewa;
            }
        }
    }

    /**
     * @return the idPenyewa
     */
    public String getIdPenyewa() {
        return idPenyewa;
    }

    /**
     * @param idPenyewa the idPenyewa to set
     */
    public void setIdPenyewa(String idPenyewa) throws Exception {
        if (idPenyewa == null || idPenyewa.matches("")) {
            throw new Exception("Nomor ID belum diisi");
        } else if (!idPenyewa.matches("[a-zA-Z0-9]*")) {
            throw new Exception("Nomor ID hanya terdiri dari karakter huruf");
        } else if (idPenyewa.length() > 20) {
            throw new Exception("Nomor ID terlalu panjang");
        } else {
            this.idPenyewa = idPenyewa;
        }
    }

    /**
     * @return the jenisId
     */
    public String getJenisId() {
        return jenisId;
    }

    /**
     * @param jenisId the jenisId to set
     */
    public void setJenisId(String jenisId) throws Exception {
        if (jenisId == null || jenisId.matches("")) {
            throw new Exception("Jenis ID belum diisi");
        } else if (!jenisId.matches("[a-zA-Z]*")) {
            throw new Exception("Jenis ID hanya terdiri dari karakter huruf");
        } else if (jenisId.length() > 10) {
            throw new Exception("Jenis ID terlalu panjang");
        } else {
            this.jenisId = jenisId;
        }
    }

    /**
     * @return the kodeAwal
     */
    public String getKodeAwal() {
        return kodeAwal;
    }

    public void batalTrans(String notrans) throws SQLException {
        PreparedStatement stat = null;
        String sql = "delete from transaksigedung where notransaksigedung=(?)";
        stat = koneksi.prepareStatement(sql);
        stat.setString(1, notrans);
        stat.execute();
        stat.close();
        koneksi.commit();

    }
}
